//牛客基础训练营 第二场 d题
//以每个节点为根查看以这个根遍历下去的节点有多少个
#include<bits/stdc++.h>
#define sd(n) scanf("%d",&n) 
#define sld(n) scanf("%lld",&n)
#define pd(n) printf("%d", (n))
#define pld(n) printf("%lld", n)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define fi first
#define se second
const int N=2e5+10;
#define INF 0x7fffffff
typedef long long int ll;
using namespace std;
//----------------------------------------------------------------------------//

int f[N],n;//f[N]只为了存父节点,这个数组用一遍就会被废弃掉

ll eg[N];

ll st[N],sum;

int main()
{
	// int T;
	// sd(T);
	// while (T--)
	// {
	// 	solve();
	// }

	sd(n);
	//int deep=0;

	for(int i=2;i<=n;i++) sd(f[i]);//父亲节点

	for(int i=1;i<=n;i++) sld(eg[i]);//边权值

	st[1]=1;//这里的1代表这棵树的根(只走了一次)
	
	for(int i=2;i<=n;i++) st[i]=st[f[i]]+1;//类似于dp去更新每个节点的经过次数
	
	sort(eg+1,eg+1+n,[](int a,int b){//排降序
		return a>b;
	});
	
	sort(st+1,st+n+1,[](int a,int b)//排降序
	{
		return a>b;
	});
	for(int i=1;i<=n;i++) sum+=(ll)(st[i]*eg[i]);//经过次数*他的边权值
	

	pld(sum);
	puts("");

	return 0;
}